package com.station.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.FastDateFormat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @ClassMethod: 日期处理类
 * @Description: 日期处理类
 * @author 李祥
 * @version V1.0
 */
public class DateUtils {

	/** 时间格式(yyyy-MM-dd) */
	public final static String DATE_PATTERN = "yyyy-MM-dd";

	/** 时间格式(yyyy-MM-dd) */
	public final static String DATE_PATTERN2 = "yyyyMMdd";

	/** 时间格式(yyyy-MM-dd HH:mm:ss) */
	public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

	/** 时间格式(yyyyMMddHHmmss) */
	public final static String DATE_TIME_PATTERN2 = "yyyyMMddHHmmss";

	/** 时间格式(HH:mm:ss) */
	public final static String DATE_TIME_PATTERN3 = "HH:mm:ss";

    /** 时间格式(HH:mm) */
	public final static String DATE_TIME_PATTERN4= "HH:mm:";

	/**
	 * 时间转字符
	 * @param date
	 * @return 年-月-日
	 */
	public static String format(Date date) {
		return format(date, DATE_PATTERN);
	}

	/**
	 * 时间转字符
	 * @param date
	 * @param pattern
	 * @return 年-月-日 时：分：秒
	 */
	public static String format(Date date, String pattern) {
		if (date != null) {
			SimpleDateFormat df = new SimpleDateFormat(pattern);
			return df.format(date);
		}
		return null;
	}

	/**
	 * 字符转时间
	 * @param date
	 * @return 年-月-日
	 */
	public static Date format(String date) {
		return format(date, DATE_PATTERN);
	}

	/**
	 * 字符转时间
	 * @param date
	 * @param pattern
	 * @return 年-月-日 时：分：秒
	 */
	public static Date format(String date, String pattern) {
		if (date != null) {
			SimpleDateFormat df = new SimpleDateFormat(pattern);
			try {
				return df.parse(date);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 获取当前时间
	 * @param pattern(DATE_PATTERN/DATE_TIME_PATTERN)
	 * @return Date 年-月-日/年-月-日 时：分：秒
	 */
	public static Date getCurrenttime(String pattern) {
		Date dateTemp = new Date();
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
			return df.parse(df.format(dateTemp));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取当前时间
	 * @param pattern(DATE_PATTERN/DATE_TIME_PATTERN)
	 * @return String 年-月-日/年-月-日 时：分：秒
	 */
	public static String getCurrenttimeStr(String pattern) {
		Date dateTemp = new Date();
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		return df.format(dateTemp);
	}

	/**
	 * 获取过去第几天的日期
	 * @param past
	 * @return
	 */
	public static String getPastDate(int past) {
		Calendar calendar = Calendar.getInstance();
    	calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
    	Date today = calendar.getTime();
    	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	String result = format.format(today);
    	return result;
	}

	/**
	 * 获取未来 第 past 天的日期
	 * @param past
	 * @return
	 */
	public static String getFetureDate(int past) {
	 	Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + past);
		Date today = calendar.getTime();
	 	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String result = format.format(today);
		return result;
	}

	/**
     * 通过时间秒毫秒数判断两个时间的间隔
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDaysByMillisecond(Date date1,Date date2) {
        int days = (int) ((date2.getTime() - date1.getTime()) / (1000*3600*24));
        return days;
    }

    /**
     * 获取指定日期前后某一天
     * @param createTime
     * @return
     */
    public static Date getYesterday (Date createTime,int num){
        Calendar c = Calendar.getInstance();
        c.setTime(createTime);
        c.add(Calendar.DATE, num);
        return c.getTime();
    }

    /**
     * 获取当前日期是星期几
     * @param dt
     * @return 当前日期是星期几
     */
    public static String getWeekOfDate(Date dt) {
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0) {
        	w = 0;
        }
        return weekDays[w];
    }

    /**
     * 通过时间秒毫秒数判断两个时间的大小
     * @param date1
     * @param date2
     * @return
     */
    public static Long compareDaysByMillisecond(Date date1,Date date2) {
        return date2.getTime() - date1.getTime();
    }

	/**
	 *  判断时间格式
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static boolean isValidDate(String date, String pattern) {
		boolean convertSuccess=true;
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		try {
			format.setLenient(false);
			format.parse(date);
		} catch (ParseException e) {
			// e.printStackTrace();
			convertSuccess=false;
		}
		return convertSuccess;
	}

	/**
	 * @description:转化时间
	 * @author:
	 * @date: 2023/4/26 9:49
	 * @param:
	 * @return:
	 **/
	public static Date format1(String originalDate){
		SimpleDateFormat originalFormat = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date date = originalFormat.parse(originalDate);
			String targetDate = targetFormat.format(date);
			Date format = format(targetDate);
			return format;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 得到当前时间字符串 格式（HHmmssSSS）
	 */
	public static String getCurrentTime() {
		return formatDate(new Date(), "HHmmssSSS");
	}

	/**
	 * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, String pattern) {
		String formatDate = null;
		if (date != null){
//			if (StringUtils.isNotBlank(pattern)) {
//				formatDate = DateFormatUtils.format(date, pattern);
//			} else {
//				formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
//			}
			if (StringUtils.isBlank(pattern)) {
				pattern = "yyyy-MM-dd";
			}
			formatDate = FastDateFormat.getInstance(pattern).format(date);
		}
		return formatDate;
	}


	/**
	 * 获取前一天的开始时间与结束时间
	 * @return
	 */
	public static String[] getPerDate() {
		//获取前一天日期
		String previousDate = DateUtils.format(DateUtils.getYesterday(new Date(), -1), DateUtils.DATE_PATTERN);
		//前一天开始时间
		String startTime = previousDate + " 00:00:00";
        //前一天结束时间
		String endTime = previousDate + " 23:59:59";
		return new String[]{startTime, endTime};
	}

	public static  Date formatStringToDate(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = null;
		try {
			d = sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return d;
	}

	public static void main(String[] args) {
		 String[] perDate = getPerDate();
		System.out.println(perDate[0] + " " + perDate[1]);
	}
}
